package com.unionftech.content_login.util

import android.annotation.SuppressLint
import android.content.Context
import android.view.Gravity
import android.view.LayoutInflater
import android.widget.Button
import android.widget.RelativeLayout
import android.widget.TextView
import com.netease.nis.quicklogin.QuickLogin
import com.netease.nis.quicklogin.helper.UnifyUiConfig
import com.netease.nis.quicklogin.listener.LoginListener
import com.netease.nis.quicklogin.listener.QuickLoginPreMobileListener
import com.netease.nis.quicklogin.listener.QuickLoginTokenListener
import com.unionftech.common.R.color
import com.unionftech.common.R.string
import com.unionftech.common.common.language.DynamicResourceManager
import com.unionftech.common.utils.LogUtils
import com.unionftech.common.utils.ProtocolUtil
import com.unionftech.common.utils.ToastUtils
import com.unionftech.common.utils.Utils
import com.unionftech.content_login.R
import com.unionftech.content_login.service.LoginConstants
import com.unionftech.content_login.ui.login.UFLoginActivity


class QuickLoginUtil private constructor() {
    private lateinit var mQuickLogin: QuickLogin
    private var mPrefetchResult: Boolean = false

    companion object {
        private const val TAG = "QuickLoginUtil"
        private var mInstance: QuickLoginUtil? = null

        @JvmStatic
        fun getInstance() = mInstance ?: synchronized(QuickLoginUtil::class) {
            mInstance ?: QuickLoginUtil().also {
                mInstance = it
            }
        }
    }

    fun init(context: Context) {
        if (::mQuickLogin.isInitialized) {
            return
        }
        mQuickLogin = QuickLogin.getInstance()
        mQuickLogin.init(context, LoginConstants.Constant.QUICK_LOGIN_BUSINESS_ID)
        mQuickLogin.setDebugMode(true)
    }

    /**
     * 一键登录预取号
     */
    fun prefetchMobileNumber(callBack: (() -> Unit)? = null) {
        if (!::mQuickLogin.isInitialized) {
            return
        }
        mQuickLogin.prefetchMobileNumber(object : QuickLoginPreMobileListener {
            override fun onGetMobileNumberSuccess(token: String, mobileNumber: String) {
                mPrefetchResult = true
                LogUtils.d(
                    TAG, "onGetMobileNumberSuccess token:${token}  mobileNumber:${mobileNumber}"
                )
                callBack?.invoke()
            }

            override fun onGetMobileNumberError(token: String, msg: String) {
                mPrefetchResult = false
                LogUtils.d(
                    TAG, "onGetMobileNumberError token:${token}  msg:${msg}"
                )
                callBack?.invoke()
            }
        })
    }

    /**
     * 调用网易的一键登录授权页
     */
    fun onePass(
        context: Context, callBack: (token: String?, accessToken: String?) -> Unit
    ) {
        //如果预取号失败，返回false,可以跳转邮箱/密码登录界面
        if (!mPrefetchResult) {
            callBack.invoke(null, null)
            return
        }
        val builder = UnifyUiConfig.Builder()
        setCustomUI(builder, context)
        mQuickLogin.setUnifyUiConfig(builder.build(context))
        mQuickLogin.onePass(object : QuickLoginTokenListener {
            override fun onGetTokenSuccess(ydToken: String, accessToken: String) {
                LogUtils.d(
                    TAG, "onGetTokenSuccess token:${ydToken}  accessToken:${accessToken}"
                )
                callBack(ydToken, accessToken)
            }

            override fun onGetTokenError(ydToken: String, code: Int, msg: String) {
                LogUtils.d(
                    TAG, "onGetTokenError token:${ydToken}  code:${code}  msg:${msg}"
                )
                //如果拉取授权页失败，返回false,可以跳转邮箱/密码登录界面
                callBack(ydToken, null)
            }
        })
    }

    @SuppressLint("UseCompatLoadingForDrawables")
    private fun setCustomUI(
        builder: UnifyUiConfig.Builder, context: Context
    ) {
        //设置登录页面背景，图片资源需放置到 drawable 目录下
        //全面屏
        builder.setBackgroundImage("ic_login_bg")
        //设置是否隐藏导航栏
        builder.setHideNavigation(true)
        //设置状态栏透明(去除透明阴影)
        builder.setStatusBarColor(android.R.color.transparent)
        //状态栏
        builder.setStatusBarDarkColor(false)
        //logo
        builder.setLogoIconDrawable(context.getDrawable(R.drawable.ic_quick_login_logo))
        builder.setLogoWidth(96)
        builder.setLogoHeight(87)
        builder.setLogoTopYOffset(120)
        //手机掩码
        //设置手机掩码颜色
        builder.setMaskNumberColor(context.getColor(color.color_white))
        //设置手机掩码顶部Y轴偏移，单位 dp
        builder.setMaskNumberBold(true)
        //设置手机掩码字体大小，单位 sp
        builder.setMaskNumberSize(28)
        //设置手机掩码顶部Y轴偏移，单位 dp
        builder.setMaskNumberTopYOffset(234)
        //认证品牌
        //设置认证品牌字体大小，单位 sp
        builder.setSloganSize(12)
        builder.setSloganColor(context.getColor(color.color_white_alpha60))
        builder.setSloganTopYOffset(280)
        //登录按钮
        builder.setLoginBtnText(DynamicResourceManager.getString(context, string.confirm_login))
        builder.setLoginBtnTextSize(14)
        builder.setLoginBtnTextColor(context.getColor(color.color_white))
        builder.setLoginBtnTopYOffset(320)
        builder.setLoginBtnWidth(327)
        builder.setLoginBtnHeight(44)
        builder.setLoginBtnMarginLeft(24)
        builder.setLoginBtnMarginRight(24)
        builder.setLoginBtnBackgroundDrawable(context.getDrawable(R.drawable.shape_quick_login_btn_bg))
        //设置其他登录方式
        val customView = LayoutInflater.from(context)
            .inflate(R.layout.layout_quick_login_custom_other_login, null)
        val tvOtherLogin = customView.findViewById<TextView>(R.id.tv_other_login)
        tvOtherLogin.text = DynamicResourceManager.getString(context, string.other_login_way)
        tvOtherLogin.setOnClickListener { UFLoginActivity.startThis(context, canReturnBack = true) }
        val layoutParams = RelativeLayout.LayoutParams(
            RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT
        )
        layoutParams.topMargin = (context.resources.displayMetrics.heightPixels * 0.52f).toInt()
        layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL)
        layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP)
        customView.layoutParams = layoutParams
        builder.addCustomView(
            customView, "rl_other_login_relative", UnifyUiConfig.POSITION_IN_BODY, null
        )
        //隐私协议
        //1.协议开始部分
        //设置隐私栏区域字体大小，单位 dp
        builder.setPrivacyDpSize(12)
        //设置隐私栏复选框宽度，单位 dp
        builder.setPrivacyCheckBoxWidth(24)
        //设置隐私栏复选框高度，单位 dp
        builder.setPrivacyCheckBoxHeight(24)
        //设置隐私栏水平方向的偏移，单位 dp
        builder.setPrivacyMarginLeft(24)
        //设置隐私栏右侧边距，单位 dp
        builder.setPrivacyMarginRight(24)
        builder.setLoadingVisible(false)
        //设置隐私栏复选框选中时的图片资源，该图片资源需要放到 drawable 目录下
        builder.setCheckedImageName("ic_quick_login_check_selected")
        //设置隐私栏复选框未选中时的图片资源，该图片资源需要放到 drawable 目录下
        builder.setUnCheckedImageName("ic_quick_login_check_normal")
        builder.setPrivacyTextColor(context.getColor(color.color_white_alpha35))
        builder.setPrivacyProtocolColor(context.getColor(color.color_white))
        //设置隐私栏声明部分起始文案 。如：隐私栏声明为"登录即同意《隐私政策》和《中国移动认证条款》且授权易盾授予本机号码"，则可传入"登录即同意"
        //我已阅读并同意《中国移动/联通/电信认证服务条款》和《客户协议》以及《隐私政策》
        builder.setPrivacyTextStart("我已阅读并同意")
        builder.setProtocolText("《客户协议》")
        val privacyUrl =
            LoginConstants.Constant.PDF_H5_BASE_URL + "?pdfUrl=" + ProtocolUtil.CLIENT_POLICY_URL
        builder.setProtocolLink(privacyUrl)
        //自定义隐私栏协议之间连接符"、"
        builder.setUserProtocolConnect("以及")
        builder.setProtocol2Text("《隐私政策》")
        val clientUrl =
            LoginConstants.Constant.PDF_H5_BASE_URL + "?pdfUrl=" + ProtocolUtil.PRIVACY_POLICY_URL
        builder.setProtocol2Link(clientUrl)
        //运营商协议与自定义隐私栏协议连接符"和"
        builder.setProtocolConnect("和")
        builder.setPrivacyTextEnd(" ")
        //隐私默认勾选状态
        builder.setPrivacyState(false)
        //设置隐私栏勾选框与文本协议对齐方式
        builder.setCheckBoxGravity(Gravity.TOP)
        //设置隐私栏文案换行后是否居中对齐，如果为 true 则居中对齐，否则左对齐
        builder.setPrivacyTextGravityCenter(false)
        //设置物理返回键是否可用,false表示使用系统的方式直接关闭界面，true表示需要自己设置返回键的监听
        builder.setBackPressedAvailable(false)
        //设置隐私栏距离屏幕底部偏移，单位 dp
        builder.setPrivacyBottomYOffset(34)
        builder.setVirtualButtonHidden(true)
        // 设置协议详细页标题
        builder.setProtocolPageNavTitle(
            "《移动服务及隐私协议》", "《联通服务及隐私协议》", "《电信服务及隐私协议》"
        )
        //设置webView弹框背景
        builder.setProtocolBackgroundImage("shape_bottom_dialog_white_bg")
        builder.setClickEventListener { viewType, code ->
            if (viewType == 4) {
                if (!Utils.isNetSystemUsable(context)) {
                    ToastUtils.longToast(
                        DynamicResourceManager.getString(
                            context, string.timeout
                        )
                    )
                }
            }
        }
        builder.setLoginListener(object : LoginListener {
            override fun onDisagreePrivacy(privacyTv: TextView?, btnLogin: Button?): Boolean {
                ToastUtils.longToast(
                    DynamicResourceManager.getString(context, string.without_select_agreement_tip)
                )
                return true
            }
        })
    }

    /**
     * 返回预期取号结果
     */
    fun prefetchMobileState(): Boolean {
        return mPrefetchResult
    }

    /**
     * 退出网易一键登录授权页
     */
    fun quitActivity(context: Context) {
        mQuickLogin.clearScripCache(context)
        mQuickLogin.quitActivity()
    }
}